<?php
/**
 * Created by : PhpStorm
 * User: Shane
 * Date: 2023-03-10
 * Time: 16:11
 * 自定义数据验证
 */

namespace control;


class CheckData
{
    const RULE_PREFIX="rule_";
    /**
     * 表单验证测试示例
     * action对应请求方法名，不强制验证
     * name|用户名|add|del  name对应字段 name1表示重组后的字段名 用户名对应自定义填写的字段名称  后面的都是对应的请求方法名
     * require|number  需要验证的格式，单个或多个后面加|验证格式
     * min:8 最小长度为8个字符的验证
     */
    private function checkFromData(){
        $datas=["name"=>""];
        $rules=[
            "action"=>["add","del","update"],
            "form"=>[
                'name|name1|用户名|add|del' => 'require|number',//多个方法后面加|分割即可支持同字段多验证
            ],
        ];
        $this->baseCheck($rules,$datas);
    }
    /**
     * @param $rules
     * @param $datas
     * 自定义表单验证
     */
    public static function baseCheck($rules,$datas,$action=""){
        $data=[];
        if(((isset($rules["action"]) && in_array($action,$rules["action"])) || empty($action)) && !empty(@$rules["form"])){
            foreach (@$rules["form"] as $k=>$v){
                $keyArr=explode('|',$k);
                $count=count($keyArr);
                if((isset($rules["action"]) && $count>3 && in_array($action,$keyArr)) || empty($action)){
                    $rulesArr=explode('|',$v);
                    for ($i=0;$i<count($rulesArr);$i++){
                        $ruleActionArr=explode(':',$rulesArr[$i]);
                        $ruleAction=self::RULE_PREFIX.($ruleActionArr[0]);
                        if(count($ruleActionArr)>1){
                            $res=self::$ruleAction(@$datas[$keyArr[0]],$keyArr[2],$ruleActionArr[1]);
                        }else{
                            $res=self::$ruleAction(@$datas[$keyArr[0]],$keyArr[2]);
                        }
                        $data[$keyArr[1]]=@$datas[$keyArr[0]];
                        if($res !== true) return  [false,$res];
                    }
                }
            }
        }
        return [true,$data];
    }

    /**
     * @param $data
     * @param $msg
     * 正常不验证
     */
    public static function rule_normal($data,$msg){
        return true;
    }
    /**
     * @param $name
     * @param $msg
     * @return bool
     * 必填验证
     */
    public static function rule_require($data,$msg){
        return (!empty($data) || $data == "0")?true:"{$msg}不能为空！";
    }

    /**
     * @param $name
     * @param $msg
     * 数字验证
     */
    private static function rule_number($data,$msg){
        return !is_numeric($data)?"{$msg}必须是数字！":true;
    }


    /**
     * @param $data
     * @param $msg
     * @return bool|string
     * 手机号验证
     */
    private static function rule_phone($data,$msg){
        return !preg_match("/^1[3456789]\d{9}$/", $data)?"请填写正确{$msg}格式！":true;
    }

    /**
     * @param $data
     * @param $msg
     * @param $length
     * @return bool|string
     * 最小数字验证
     */
    private static function rule_minNumber($data,$msg,$minNumber){
        return ($data < $minNumber)?"{$msg}不能小于{$minNumber}":true;
    }
    /**
     * @param $data
     * @param $msg
     * @param $length
     * @return bool|string
     * 最小数字验证
     */
    private static function rule_maxNumber($data,$msg,$maxNumber){
        return ($data > $maxNumber)?"{$msg}不能小于{$maxNumber}":true;
    }
    /**
     * @param $data
     * @param $msg
     * @param $length
     * 字段最小长度验证
     */
    private static function rule_min($data,$msg,$length){
        return (mb_strlen($data)< $length)?"{$msg}最小填写{$length}个字符":true;
    }

    /**
     * @param $data
     * @param $msg
     * @param $length
     * 字段最大长度验证
     */
    private static function rule_max($data,$msg,$length){
        return (mb_strlen($data)> $length)?"{$msg}最大填写{$length}个字符":true;
    }
}